home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’95 / Reminder Manager / Chimer.c < prev    next >
C/C++ Source or Header  |  1995-06-24  |  3KB  |  139 lines

  1. #include "Chimer.h"
  2. #include "Sound.h"
  3. #include "stddef.h"
  4.  
  5. SndChannelPtr        gChan1, gChan2, gChan3, gLastChan;
  6.  
  7. extern short MasterVolume;
  8.  
  9. // Thank you Jim Reekes, for helpful guidance
  10.  
  11. OSErr InitChimer(void)
  12. {
  13.     SndCommand        cmd;
  14.     SndListHndl        snd,snd2;
  15.     OSErr            err;
  16.     
  17.     gChan1 = nil;
  18.     gChan2 = nil;
  19.     gChan3 = nil;
  20.  
  21. ////// Get the CHIME sound from my resources
  22.     snd = (SndListHndl)GetResource('snd ', 1000);
  23.     if (snd == nil)
  24.         return (ResError());
  25.     
  26.     // This builds a sound manager command that installs the sound as the
  27.     // synthesizer voice
  28.     HLock((Handle)snd);
  29.     cmd.cmd = soundCmd;
  30.     cmd.param2 = (long)((long)(*snd) + offsetof(SndListResource, dataPart));
  31.     
  32.     // Now stuff the command into each of the first two channels 
  33.     err = SndNewChannel(&gChan1, sampledSynth, 0, nil);
  34.     if (err != noErr)
  35.         return (err);
  36.     err = SndDoImmediate(gChan1, &cmd);
  37.  
  38.     // I have no idea why I'm stuffing the address of the sound into a 
  39.     // userinfo (for the application's use) field
  40.     // I got the bits from Reekes and I forget why
  41.     gChan1->userInfo = cmd.param2;
  42.  
  43.     err = SndNewChannel(&gChan2, sampledSynth, 0, nil);
  44.     if (err != noErr)
  45.         return (err);
  46.     err = SndDoImmediate(gChan2, &cmd);
  47.  
  48. ////// Get the CHUNK sound from my resources
  49.     snd2 = (SndListHndl)GetResource('snd ', 1001);
  50.     if (snd2 == nil)
  51.         return (ResError());
  52.     
  53.     // This builds a sound manager command that installs the sound as the
  54.     // synthesizer voice
  55.     HLock((Handle)snd2);
  56.     cmd.cmd = soundCmd;
  57.     cmd.param2 = (long)((long)(*snd2) + offsetof(SndListResource, dataPart));
  58.     
  59.     // Now stuff the command into the third channel 
  60.     err = SndNewChannel(&gChan3, sampledSynth, 0, nil);
  61.     if (err != noErr)
  62.         return (err);
  63.     err = SndDoImmediate(gChan3, &cmd);
  64.  
  65.     // I have no idea why I'm stuffing the address of the sound into a 
  66.     // userinfo (for the application's use) field
  67.     // I got the bits from Reekes and I forget why
  68.     gChan3->userInfo = cmd.param2;
  69.  
  70.     return (noErr);
  71. }
  72.  
  73.  
  74. void PlayAChime(short chime)
  75. {
  76.     SndCommand    cmd;
  77.     short        note;
  78.     OSErr        err;
  79.  
  80.     switch (chime)
  81.     {
  82.         case 1:
  83.             gLastChan = gChan1;
  84.             note = 55;
  85.             break;
  86.  
  87.         case 2:
  88.             gLastChan = gChan1;
  89.             note = 57;
  90.             break;
  91.  
  92.         case 3:
  93.             gLastChan = gChan2;
  94.             note = 60;
  95.             break;
  96.         
  97.         case 4:
  98.             gLastChan = gChan2;
  99.             note = 65;
  100.             break;
  101.         
  102.         case 5:
  103.             gLastChan = gChan2;
  104.             note = 67;
  105.             break;
  106.         
  107.         case 6:
  108.             gLastChan = gChan3;
  109.             note = 60;
  110.             break;
  111.     }
  112.  
  113.     // First send a command that tells how loud to make the sound
  114.     cmd.cmd = ampCmd;
  115.     cmd.param1 = (Random() & 0x7FFF) % 5;
  116.     cmd.param1 = (cmd.param1 + 1) * MasterVolume;
  117.     err = SndDoImmediate(gLastChan, &cmd);
  118.  
  119.     // why is this here? to prevent playing?
  120.     cmd.cmd = quietCmd;
  121.     err = SndDoImmediate(gLastChan, &cmd);
  122.  
  123.     // Put a command in the queue to play the sound
  124.     // The frequency is the midi note number set above in the case statement
  125.     // The duration is set to 1/4 second
  126.     cmd.cmd = freqDurationCmd;
  127.     cmd.param1 = 500;
  128.     cmd.param2 = note;
  129.     err = SndDoCommand(gLastChan, &cmd, true);
  130.  
  131.     // After the above command is complete, tell the synth to shut up
  132.     // If you don't, it'll just keep playing the same note.
  133.     cmd.cmd = quietCmd;
  134.     err = SndDoCommand(gLastChan, &cmd, true);
  135.     
  136. }
  137.  
  138.  
  139.